import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import explained_variance_score,\
mean_absolute_error,mean_squared_error,median_absolute_error,r2_score

a=pd.read_csv('./分析/as.csv',encoding='gbk',dtype='str')   #定义类型确保没有小数点
#处理数据
b=a.drop_duplicates(subset=['名称'])      #对数据去重
test=b.dropna(how='any',subset=['上映时间'],inplace=False)     #对上映时间去空值
c_d=test.dropna(how='any',subset=['类型'],inplace=False)      #对类型去空值
c=c_d.drop(c_d[(c_d['上映时间']=='19524') | (c_d['上映时间']=='19530') | (c_d['上映时间']=='19630') |
(c_d['上映时间']=='19637') | (c_d['上映时间']=='19900') |(c_d['上映时间']=='19991') | (c_d['上映时间']=='19994') | (c_d['上映时间']=='20014') |(c_d['上映时间']=='20117')
| (c_d['上映时间']=='20165') | (c_d['上映时间']=='20196') ] .index  )

#构建评价回归模型
c_rc=c.drop(c[(c['上映时间'] == '2021')].index)
asf=c_rc[['名称','上映时间']].groupby(by=['上映时间']).count()     #年份电影总数
types_rc=tuple(asf['名称'].drop(asf.index[:3]))
bs=c_rc.drop_duplicates(subset=['上映时间'])                 #去重
bs_rc=bs.sort_values(['上映时间'],ascending=True)                #排序
re_data=bs_rc['上映时间']
re_datas=tuple(bs_rc['上映时间'].drop(bs_rc.index[:3]))
totals=pd.concat([pd.DataFrame(re_datas),pd.DataFrame(types_rc)],axis=1)
totals.columns=['年份','总数']
'''
total=totals.drop(['年份'],axis=1)
total.index = range(1914,1921)
data_train = total.loc[range(1914,2021)].copy()
data_std = data_train.std() # 取标准差
data_mean = data_train.mean() # 取平均值
data_train = (data_train - data_mean)/data_std # 数据标准化
'''
'''
totals_a=totals[6:37]
totals_a.columns=['年份','总数']
total=totals_a.drop(['年份'],axis=1)
total.index = range(1920,1951)
total.loc[1951] = None
total.loc[1952] = None
l=['总数']
for i in l:
    f = GM11(total.loc[range(1920,1951),i].values)[0]
    total.loc[1951,i] = f(len(totals)-1)
    total.loc[1952,i] = f(len(totals))
    total[i] = total[i].round(2) # 保留2位小数
print('预测结果为：\n',total.loc[1951:1952,:])
'''
X = totals['年份'].astype('int')
y = totals['总数'].astype('int')
## 将数据划分为训练集测试集

X_train,X_test,y_train,y_test = train_test_split(X[6:37],y[6:37],test_size = 0.2,random_state=True)
## 建立线性回归模型
clf = LinearRegression().fit(X_train.values.reshape(-1, 1) ,y_train.values.reshape(-1, 1) )
print('建立的LinearRegression模型为：','\n',clf)
clf.coef_
clf.intercept_
y_pred = clf.predict(X_test.values.reshape(-1, 1) )
print('预测前20个结果为：','\n',y_pred[:20])


rcParams['font.sans-serif'] = 'SimHei'
fig = plt.figure(figsize=(10,6)) ##设定空白画布，并制定大小
##用不同的颜色表示不同数据
plt.plot(range(y_test.shape[0]),y_test,color="blue", linewidth=1.5, linestyle="-")
plt.plot(range(y_test.shape[0]),y_pred,color="red", linewidth=1.5, linestyle="-.")
plt.legend(['真实值','预测值'])
plt.show() ##显示图片


print('Boston数据线性回归模型的平均绝对误差为：',
     mean_absolute_error(y_test,y_pred))
print('Boston数据线性回归模型的均方误差为：',
     mean_squared_error(y_test,y_pred))
print('Boston数据线性回归模型的中值绝对误差为：',
     median_absolute_error(y_test,y_pred))
print('Boston数据线性回归模型的可解释方差值为：',
     explained_variance_score(y_test,y_pred))
print('Boston数据线性回归模型的R方值为：',
     r2_score(y_test,y_pred))